package _贪心;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author ShadowLim
 * @create 2022-03-19-16:55
 */
public class _付账问题 {
    /**
     * 思路分析
     *     贪心+模拟，为了使标准差最小，每一个人出的钱  必须接近平均值。
     *
     * 那就分两种情况：
     *      第 i 人带的钱不够平均数 avg，那么他只能出他带的全部钱。
     *      第 i 人带的钱比平均数 avg 多，那么他可以多付一些。
     * 所以基本步骤为：
     *  对 arr 从小到大排序。
     *  前一部分人的钱不够，那么就出他们所有的钱。
     *  从总付钱数中扣除前一部分人出的钱，得剩余需要出的钱数为S'，以及剩余的后一部分人的出钱平均数 curAvg。
     *  后一部分人的钱多，他们多出一些。怎么出？这部分人也分两类：
     *  比较有钱的，但是他的钱也不够curAvg，那么他的钱还是要全出。
     *  非常有钱的，不管怎么付他都有富余。
     *
     * 原文链接：https://blog.csdn.net/Hello_world_n/article/details/122427977
     * @param args
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(), s = scanner.nextInt();
        int[] arr = new int[n];
        double average = 0.0;
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        scanner.close();
        average = 1.0 * s / n;  // 平均值，该值只与总消费和人数有关
        double curAvg = average;    // 剩余人应付总额的平均值
        Arrays.sort(arr);
        double out = 0.0;
        for (int i = 0; i < n; i++) {
            // 如果当前人的钱高于剩余总额平均值
            // 则他和后面的人一样，仅需支付平均值即可
            // 否则，即低于平均值，则他的所有钱都用于支付
            if (arr[i] < curAvg) {
                out += Math.pow(arr[i] - average, 2);
                s -= arr[i];     // 更新剩余人应付总额
                curAvg = s * 1.0 / (n - i - 1); // 更新剩余人应付总额平均值
            } else {
                out += (n - i) * Math.pow(curAvg - average, 2);
                break;
            }
        }
        double ans = Math.sqrt(out / n);
        System.out.printf("%.4f", ans);
    }
}
